const addZero = (val) => {
    if (val < 10) {
        return `0${val}`;
    }
    return val;

};
/**
 * 日期时间格式化
 * @param {Date} value
 * @param {String} type : 'YMD'/'YMDHMS'/'HMS'/'YM'/'YMDHM'
 */
const formatTime = (value, type) => {
    var dataTime = '';
    var data = new Date();
    data.setTime(value);
    var year = data.getFullYear();
    var month = addZero(data.getMonth() + 1);
    var day = addZero(data.getDate());
    var hour = addZero(data.getHours());
    var minute = addZero(data.getMinutes());
    var second = addZero(data.getSeconds());
    if (type == 'YMD') {
        dataTime = `${year}-${month}-${day}`;
    } else if (type == 'YMDHMS') {
        dataTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
    } else if (type == 'YMDHM') {
        dataTime = `${year}.${month}.${day} ${hour}:${minute}`;
    } else if (type == 'HMS') {
        dataTime = `${hour}:${minute}:${second}`;
    } else if (type == 'YM') {
        dataTime = `${year}-${month}`;
    } else {
        dataTime = `${year}-${month}-${day}`;
    }
    return dataTime;
};
/**
 * 时间格式化，将时间转化为相应的时间格式，时间单位是s
 * @param {Number} value
 * @param {String} type : 'HMS'
 */
const dealTime = (value, type) => {
    let timeObj = {
        hours: Math.floor(value / 60 / 60) % 24,
        minutes: Math.floor(value / 60) % 60,
        seconds: Math.floor(value % 60),
    };

    let hour = `${addZero(timeObj.hours)}`;
    let minute = `${addZero(timeObj.minutes)}`;
    let second = `${addZero(timeObj.seconds)}`;

    if (type === 'HMS') {
        return `${hour}:${minute}:${second}`;
    }
};

// 处理东八区时区
function dealEase8Time(date) {
    let targetTimezone = -8;
    const d = new Date();
    // 当前时区与中时区时差，以min为维度
    let _dif = d.getTimezoneOffset();
    // 本地时区时间 + 时差  = 中时区时间
    // 目标时区时间 + 时差 = 中时区时间
    // 目标时区时间 = 本地时区时间 + 本地时区时差 - 目标时区时差
    // 东9区时间
    let east8time = date + _dif * 60 * 1000 - (targetTimezone * 60 * 60 * 1000);
    return east8time;
}

// 时间戳转时分秒，不依赖于new Date, 因为在非东八区，new Date 可能不准
const time2HMS = (date) => {
    date = date + 8 * 60 * 60 * 1000;
    const hours = parseInt((date % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), 10);
    const minutes = parseInt((date % (1000 * 60 * 60)) / (1000 * 60), 10);
    const seconds = parseInt((date % (1000 * 60)) / 1000);

    return { hours, minutes, seconds };
};

function date2EasyTime(date) {
    const time = new Date(date).getTime();
    let targetTimezone = -8;
    const d = new Date();
    // 当前时区与中时区时差，以min为维度
    let _dif = d.getTimezoneOffset();
    // 本地时区时间 + 时差  = 中时区时间
    // 目标时区时间 + 时差 = 中时区时间
    // 目标时区时间 = 本地时区时间 + 本地时区时差 - 目标时区时差
    // 东9区时间
    let east8time = time + _dif * 60 * 1000 - (targetTimezone * 60 * 60 * 1000);

    return east8time;

}

/**
 * 非东八区的小时，分钟数据转成东八区的时间戳
 * @param {Date} date 日期 2021-03-30
 * @param {number} hour 小时
 * @param {number} mins 分钟
 * @returns
 */
function date2EasyWithHourMins(date, hour, mins) {
    //
    const deltaHours = new Date(date).getHours();
    // 东八区默认的小时数是 8
    return date2EasyTime(date) + (hour - deltaHours) * 1000 * 60 * 60 + mins * 1000 * 60;
}

// 判断是否是东八区
function isEase8Time() {
    let targetTimezone = -8;
    const d = new Date();
    let _dif = d.getTimezoneOffset();
    return _dif * 60 * 1000 === (targetTimezone * 60 * 60 * 1000);
}
// 列表格式化时间方法
function formatListTime(time) {
    const dateFormat = (date, fmt) => {
        /** @type {object} */
        var o = {
            Z: '',
            'M+': date.getMonth() + 1, // 月份
            'd+': date.getDate(), // 日
            'h+': date.getHours(), // 小时
            'H+': date.getHours() > 12 ? date.getHours() - 12 : date.getHours(), // 12小时制
            'm+': date.getMinutes(), // 分
            's+': date.getSeconds(), // 秒
            'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
            S: date.getMilliseconds(), // 毫秒
        };
        if ((/(y+)/).test(fmt)) fmt = fmt.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length));
        for (var k in o) { if (new RegExp(`(${k})`).test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : (`00${o[k]}`).substr((`${o[k]}`).length)); }
        return fmt;
    };
    /** @type {string} */
    let timeStr = '';
    /** @type {object} */
    const nowDate = new Date(dealEase8Time(Date.now()));

    /** @type {object} */
    const todyStartTime = new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate());
    /** @type {number} */

    let __time = dealEase8Time(time);
    const diffTime = todyStartTime - __time;
    // let __time = time;

    if (
        nowDate.getFullYear() !== new Date(__time).getFullYear()
        && nowDate.getFullYear() - new Date(__time).getFullYear() > 1
    ) {
        if (!time) return '';
        timeStr = `${nowDate.getFullYear() - new Date(__time).getFullYear()}年前`;
    } else if (diffTime > 86400000) {
        // 大于2天
        timeStr = dateFormat(new Date(__time), 'MM月dd日');
    } else if (diffTime > 0) {
        // 大于0天
        timeStr = '昨天';
    } else {
        // 今天
        timeStr = dateFormat(new Date(__time), 'hh:mm');
    }
    return timeStr;
}

/**
 * @param {number} date 时间戳
 * @param {string} fmt 格式化参数
 * @param {boolean} isConvert 是否需要东八区转换
 * @returns
 */
function dateFormat(date, fmt, isConvert = true) {
    // time2HMS不能先调用东八区转换函数
    if (date instanceof Date) {
        date = date.getTime();
    }
    const { hours, minutes, seconds } = time2HMS(date);
    if (isConvert) {
        date = dealEase8Time(date);
    }
    date = new Date(date);
    var o = {
        // "Z":getHZ(date),//暂时不用了
        Z: '',
        'M+': date.getMonth() + 1, // 月份
        'd+': date.getDate(), // 日
        'h+': hours, // 小时
        'H+': hours > 12 ? hours - 12 : hours, // 12小时制
        'm+': minutes, // 分
        's+': seconds, // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        S: date.getMilliseconds(), // 毫秒
    };
    if ((/(y+)/).test(fmt)) fmt = fmt.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length));
    for (var k in o) { if (new RegExp(`(${k})`).test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length))); }
    return fmt;
}
export {
    formatListTime,
    formatTime,
    dealTime,
    dealEase8Time,
    time2HMS,
    date2EasyTime,
    date2EasyWithHourMins,
    isEase8Time,
    dateFormat,
};
